可编辑列表

本示例展示如何在 Scripting 应用中使用 ListForEachEditButton 组件构建一个支持 删除与排序操作 的可编辑列表。


概览

你将学习如何:

  • 使用 ForEach 渲染动态列表项
  • 实现列表项的删除和拖动排序功能
  • 使用 EditButton 启用编辑模式
  • 通过 useState 管理列表的状态

示例代码

1. 导入所需模块

1import { Color, EditButton, ForEach, List, Navigation, NavigationStack, Script, Text, useState } from "scripting"

2. 定义组件状态

使用 useState 初始化颜色字符串数组作为列表数据:

1const [colors, setColors] = useState<Color[]>([
2  "red",
3  "orange",
4  "yellow",
5  "green",
6  "blue",
7  "purple",
8])

3. 处理删除操作

onDelete 方法根据传入的索引数组移除对应的列表项:

1function onDelete(indices: number[]) {
2  setColors(colors.filter((_, index) => !indices.includes(index)))
3}

4. 处理拖动排序操作

onMove 方法将被拖动的元素插入至目标位置:

1function onMove(indices: number[], newOffset: number) {
2  const movingItems = indices.map(index => colors[index])
3  const newColors = colors.filter((_, index) => !indices.includes(index))
4  newColors.splice(newOffset, 0, ...movingItems)
5  setColors(newColors)
6}

5. 构建可编辑列表界面

主界面使用 NavigationStackList 构建,并通过 toolbar 添加 EditButton 实现编辑模式:

1return <NavigationStack>
2  <List
3    navigationTitle={"Editable List"}
4    navigationBarTitleDisplayMode={"inline"}
5    toolbar={{
6      confirmationAction: [
7        <EditButton />,
8      ]
9    }}
10  >
11    <ForEach
12      count={colors.length}
13      itemBuilder={index =>
14        <Text
15          key={colors[index]} // 每项必须提供唯一 key
16        >{colors[index]}</Text>
17      }
18      onDelete={onDelete}
19      onMove={onMove}
20    />
21  </List>
22</NavigationStack>

6. 启动视图并退出脚本

1async function run() {
2  await Navigation.present({
3    element: <Example />
4  })
5
6  Script.exit()
7}
8
9run()

关键组件说明

  • List:用于展示可滚动的列表视图。
  • ForEach:根据指定数量动态渲染子视图。
  • EditButton:切换列表的编辑模式,支持删除和排序操作。
  • onDelete / onMove:在用户删除或拖动项时调用的回调函数。
  • useState:用于追踪和更新当前的列表数据。

注意事项

  • ForEach 中的每个子项必须提供唯一的 key,以确保视图更新正常。
  • 仅在编辑模式下才能进行删除和排序操作,需通过 EditButton 启用。

适用场景

  • 可排序的任务列表或待办事项
  • 支持编辑的设置项集合
  • 根据用户输入动态更新的内容展示

该示例为你创建交互式脚本或工具提供了灵活的列表功能模板。